/* Programa principal para testes - Procura */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "fila.h"

#define TAM 512


void verifica_linha_de_comando( int argc, char *argv[] );
void uso_correto();

int main( int argc, char *argv[] ) {

	int i, numFilhos = 0;
	char *linha, *nomeArqStrings, *strLinha;
	tFila *filaArquivos, *filaStrings;
	FILE *arquivoStrings;
	size_t tam = TAM;

	verifica_linha_de_comando( argc, argv );
	
	// obtem da linha de comando o numero de processos filhos e o nome do arquivo com as strings
	numFilhos = atoi( argv[2] );
	nomeArqStrings = (char*) malloc(sizeof(char)*TAM);
	strcpy( nomeArqStrings, argv[4] );
	
	filaArquivos = filaInit();
	filaStrings = filaInit();
	
	if ( filaArquivos ==  NULL ) {
		fprintf( stderr, "Erro: falhou a inicializacao da Fila de Arquivos.\n" );
		exit(-2);
	}
	else if ( filaStrings ==  NULL) {
		fprintf( stderr, "Erro: falhou a inicializacao da Fila de Strings.\n" );
		exit(-2);
	}

	// Obtem da entrada padrao cada arquivo a ser pesquisado e o insere na fila de Arquivos.
	while( (linha = (char*) malloc(sizeof(char)*TAM)) && (scanf( "%s", linha ) > 0 )) {
		filaAdd( filaArquivos, linha );
		free(linha);
	}
	
	
	// Abre o arquivo com as strings a serem procuradas
	arquivoStrings = fopen( nomeArqStrings, "rb" );
	if( arquivoStrings == NULL ) {
		fprintf( stderr, "Erro: falhou a abertura do arquivo %s.\n", nomeArqStrings );
		exit(-2);
	}

	// Obtem cada linha do arquivo de strings e o insere na fila de strings.
	while( (strLinha = (char*) malloc(sizeof(char)*tam)) && 
	       (getline( &strLinha, &tam, arquivoStrings )) > 0 ) {
		filaAdd( filaStrings, strLinha );
		free(strLinha);
	}


	fclose( arquivoStrings );


	#ifdef DEPURA
		printf( "Tamanho da fila de Arquivos: %d\n", filaArquivos->tamanho );
		filaImprime( filaArquivos );

		printf( "Tamanho da fila de Strings: %d\n", filaStrings->tamanho );
		filaImprime( filaStrings );
	#endif

	
	int pid;
	int pidFilhos[numFilhos];   // cria um vetor para guardar o pid dos filhos
	int pipe_pai_2_filho[numFilhos][2],
	    pipe_filho_2_pai[numFilhos][2];

	// faz o fork para cada um dos filhos (nem todos os processos filhos podem ser usados)
	for ( i = 0; i < numFilhos; i++ ) {
		
		pid = fork();
				
		if ( pid == -1 ) {
			fprintf( stderr, "Erro: falhou o fork - criacao do filho %d.\n", i );
			exit(-2);
		}
		else if ( pid == 0 ) {   // eh o processo filho
		
		
		}
		else if ( pid > 0 ) {   // eh o processo pai
			pidFilhos[i] = pid;  // guarda o pid do filho criado
		}

	}

	return 0;
}



/* Verifica se a linha de comandos foi digitada corretamente e imprime mensagem de erro,
   caso o programa nao tenha sido usado corretamente.
   Exemplo de uso correto:
	   procura -np 4 -f str_file
	   onde: -np eh o numero de processos filhos a ser criado.
	         -f eh o nome do arquivo texto que contem as strings a serem buscadas
*/

void verifica_linha_de_comando( int argc, char *argv[] ) {
	
	int resArg1 = -1, resArg3 = -1;

	if ( argc < 5 ) {
		uso_correto();
		exit(-1);
	}

	resArg1 = strcmp( "-np", argv[1] );
	resArg3 = strcmp( "-f", argv[3] );

	if ( resArg1 != 0 || resArg3 != 0 ) {
		uso_correto();
		exit(-1);
	}
}



/* Exibe uma mensagem com o uso correto do programa, na saida stderr.  */

void uso_correto() {
	fprintf( stderr, "\nUso correto:\n" );
	fprintf( stderr, "\tprocura -np [#] -f [str_file]\n\n" );
	fprintf( stderr, "\t-np [#]\t\tDefine o numero de processos filhos a ser criado.\n" );
	fprintf( stderr, "\t-f [str_file]\tInforma o nome do arquivo texto que contem as strings a serem procuradas.\n\n" );
}
